import { posInfo } from './data-config'

// 获取模板字符正则
export function getReg (key: string, preSpace?: boolean): RegExp {
    return preSpace ? new RegExp(`\\s*\{${key}}`, 'g') : new RegExp(`\{${key}}`, 'g')
}

// 给元素增加自定义属性
function addElAttr (elStr: string, key: string) {
    let newStr = ''
    // 找到第一个 > 的位置
    const index = elStr.indexOf('>')
    // 判断前一个字符是不是 /
    if (elStr.charAt(index - 1) === '/') {
        newStr = `${elStr.substring(0, index - 1)} data-s="${key}" ${elStr.substring(index - 1)}`
    } else {
        newStr = `${elStr.substring(0, index)} data-s="${key}" ${elStr.substring(index)}`
    }
    return newStr
}

// 格式化脚本html片段
export function formatTemplate (arr: string[], key: string):string {
    const newArr = arr.map(item => addElAttr(item, key))
    return newArr.join('\n')
}

// 获取数组索引
function getIndex (arr: string[], str: string): number {
    for (let i = 0, len = arr.length; i < len; i ++) {
        if (arr[i] === str) return i
    }
    return -1
}

// 链式插入算法
function insertLink (htmlStr: string, preEjsTpl: string, insertEjsTplArr: string[]) {
    const arr = htmlStr.split(preEjsTpl)
    if (arr.length > 1) {
        const [first, ...rest] = arr
        return `${first}${preEjsTpl}${insertEjsTplArr.join('')}${rest.join('')}`
    } else {
        insertEjsTplArr.unshift(preEjsTpl)
        const preIndex = getIndex(posInfo, preEjsTpl) -1
        return insertLink(htmlStr, posInfo[preIndex], insertEjsTplArr)
    }
}

// 模板字符串去重
export function duplicateRemove (htmlStr: string, ejsTpl: string) {
    const arr = htmlStr.split(ejsTpl)
    if (arr.length > 1) {
        const [first, ...rest] = arr
        return `${first}${ejsTpl}${rest.join('')}`
    } else {
        // htmlStr 中不含 ejsTpl
        // 前一个模板索引
        const preIndex = getIndex(posInfo, ejsTpl) -1
        // 插入前一个索引对应的模板
        return insertLink(htmlStr, posInfo[preIndex], [ejsTpl])
    }
}

// 将html转化成模板
export function replaceTpl (str: string, type: string) {
    if (!str) return str
    if (type === 'script') {
        return str.replace(/<script\b[^>]*data-s="([^"|']*)"[^>]*>([\s\S]*?)<\/script>/g, function () {
            return `<%- ${arguments[1]} %>`
        })
    }
    if (type === 'link') {
        return str.replace(/<link\b[^>]*data-s="([^"|']*)"[^>]*\/>/g, function () {
            return `<%- ${arguments[1]} %>`
        })
    }
    return str
}